#ifndef JSON_H
#define JSON_H

#include <iostream>
#include <vector>
using namespace std;

#define JSON_TNIL 0
#define JSON_TNUM 1
#define JSON_TBOOL 2
#define JSON_TSTR 3
#define JSON_TARR 4
#define JSON_TOBJ 5

typedef long double JSON_NUM;
typedef string JSON_STR;
typedef bool JSON_BOOL;

extern int precision;

class JSON_OBJ;

class JSON_VAR
{
public:
    void *p;
    string name;
    char type;

    JSON_VAR();
    JSON_VAR(JSON_NUM *ptr, string _name = "");
    JSON_VAR(JSON_BOOL *ptr, string _name = "");
    JSON_VAR(JSON_STR *ptr, string _name = "");
    JSON_VAR(vector<JSON_VAR> *ptr, string _name = "");
    JSON_VAR(JSON_OBJ *ptr, string _name = "");

    JSON_VAR(JSON_NUM, string _name = "");
    JSON_VAR(JSON_BOOL, string _name = "");
    JSON_VAR(JSON_STR, string _name = "");
    JSON_VAR(vector<JSON_VAR>, string _name = "");
    JSON_VAR(JSON_OBJ, string _name = "");

    string to_string();
    vector<JSON_VAR> to_array();

    int getVal(const string &, int, int *);
    void del();
    void init();
    string display(int ts, bool = 1);
};

class JSON_OBJ
{
public:
    vector<JSON_VAR> var;
    void load(const string &, int, int *);
    void read(const string &);
    void del();
    void write(const string &path);
    JSON_VAR getVar(const string &name);
    string display(int = 0);

    ~JSON_OBJ();
};
typedef vector<JSON_VAR> JSON_ARR;
#endif